package it.storm.solution;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 867. 转置矩阵
 * https://leetcode-cn.com/problems/transpose-matrix/
 */
public class Solutions_867 {
    public static void main(String[] args) {
        int[][] matrix1 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        // output: {{1, 4, 7}, {2, 5, 8}, {3, 6, 9}}

        int[][] matrix2 = {{1, 2, 3}, {4, 5, 6}};
        // output: {{1, 4}, {2, 5}, {3, 6}}

        List<int[][]> inputs = new ArrayList<>();
        inputs.add(matrix1);
        inputs.add(matrix2);

        for (int[][] input : inputs) {
            int[][] result = transpose(input);
            System.out.println(Arrays.deepToString(result));
        }
    }

    /**
     * 解题思路：
     * 交换行列索引
     */
    public static int[][] transpose(int[][] matrix) {
        if (matrix == null) {
            return new int[0][0];
        }
        int row = matrix.length, col = matrix[0].length;
        int[][] res = new int[col][row];

        // 遍历每一列，元素依次添加到 res 中
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                res[j][i] = matrix[i][j];
            }
        }
        return res;
    }

    /**
     * 解题思路：
     * 原本的第 1 行，变成 res 中的第 1 列，第 2 行变成 res 中的第 2 列
     */
    public static int[][] transpose2(int[][] matrix) {
        if (matrix == null) {
            return new int[0][0];
        }
        int row = matrix.length, col = matrix[0].length;
        int[][] res = new int[col][row];
        int idx = 0;

        // 遍历每一列，元素依次添加到 res 中
        for (int i = 0; i < col; i++) {
            for (int j = 0; j < row; j++) {
                res[idx / row][idx % row] = matrix[j][i];
                idx ++;
            }
        }
        return res;
    }
}
